class Person{
    // 创建对象的时候有时候要传些参数来定义一些属性什么的，我们使用构造函数，你不写会给你创一个默认的
    // 他会在创建对象的时候调用，就是new的时候
    // 类里的对象指向实例
    constructor(name:string){
        this.name=name;
    }
    name:string;
    age:number = 18
    // 在属性前使用static关键字可以定义静态属性，就是不需要创建对象就能用的属性，对象里不会打印出来
    static talk:string = "我就是静态属性"

    // 在属性前加个readonly只能看不能改
    readonly msg:string = '我是只读属性'
    // readonly可以和static一起用，static写前面

    // 方法也能加static
}

// 类的继承   class 类名 extends 父类名{
//继承后子类会有父类所有的方法和属性
//通过继承可以把多个类共有的代码写在一个父类中
//继承中super关键字就是父类
// 如果在子类中使用构造函数，必须对父类的构造进行调用，因为父类的被子类的顶掉了（被子类重写了），调用方法是在子类构造中super(),相当于调用父类构造，你可以传参
// }


// 在类前面加abstract可以防止类被创建对象，叫抽象类(用于继承)，还要抽象方法abstract 方法名():void;返回值类型不是必须的，抽象方法只能在抽象类中写，表示有这个方法


// 接口,用于定义一个类的结构，定义类应该包含哪些属性和方法，接口可以当成类型声明使用，接口只定义结构，不考虑实际值
// 使用接口 class 类名 implements 接口名字{},让这个类来符合接口，接口里有的类里必须有，接口就是定义类的结构的
interface mx{
    name:string,
    age:number
}

// js中没有接口和抽象类，只有ts有
const per1 = new Person('王八')

console.log(per1)

console.log(Person.talk)